package lib

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"honeyweb/conf"
	"honeyweb/log"
	"os"
	"path"
)

var beeDB *gorm.DB

func GetBeeDB() *gorm.DB {
	return beeDB
}

//初始化全局数据库
func InitMysql() {
	file := path.Join(configPath, "mysql.toml")
	if  mconf, err := conf.ReadFromFile(file); err == nil {
		gormdb, err := ConnectMysql(mconf)
		if err != nil {
			log.S().Errorf("Mysql Init err: %v", err)
			os.Exit(1)
		}
		beeDB = gormdb
		showInfo(beeDB)
	} else {
		log.S().Errorf("Mysql Init read config err: %v", err)
		os.Exit(1)
	}
}

//连接mysql数据库
func ConnectMysql(c *conf.MysqlConf) (*gorm.DB, error){
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?%s",c.Username,c.Password,c.Path, c.Dbname, c.Config)
	mysqlConf := mysql.Config{
		DSN: dsn,
		DefaultStringSize:         191,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}
	gormConfig := config(c.LogMode)
	db, err := gorm.Open(mysql.New(mysqlConf), gormConfig)
	if err == nil {
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(c.MaxIdleConns)
		sqlDB.SetMaxOpenConns(c.MaxOpenConns)
	}
	return db, err
}


// config 根据配置决定是否开启日志
func config(mod bool) (c *gorm.Config) {
	if mod {
		c = &gorm.Config{
			Logger:                                   logger.Default.LogMode(logger.Info),
			DisableForeignKeyConstraintWhenMigrating: true,
		}
	} else {
		c = &gorm.Config{
			Logger:                                   logger.Default.LogMode(logger.Silent),
			DisableForeignKeyConstraintWhenMigrating: true,
		}
	}
	return
}